package org.vison.framework.doc.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.vison.framework.doc.annotation.ApiProperty;
import org.vison.framework.doc.config.DocProperties;
import org.vison.framework.doc.DocScanner;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 统一接口文档控制器
 * 提供REST和SOA接口文档的统一Web访问入口
 */
@Controller
@RequestMapping("${wonfu.doc.base-path:/docs}")
public class DocController {

    @Autowired
    private DocScanner restDocScanner;

    @Autowired
    private DocProperties docProperties;

    /**
     * 访问统一文档首页
     *
     * @return 重定向到文档首页
     */
    @GetMapping
    public String index() {
        return "redirect:/doc/index.html";
    }

    /**
     * 获取所有接口文档数据
     *
     * @return 包含REST和SOA接口信息的统一数据
     */
    @GetMapping("/api")
    @ResponseBody
    public BaseRes<List<Apis>> getAllApiDocs() {
        List<ApiInfo> restApiInfoList = restDocScanner.getApiInfoList();
        // 按category 分类 并排序
        Map<String, List<ApiInfo>> restApiMap = restApiInfoList.stream()
                .collect(Collectors.groupingBy(ApiInfo::getApiCategory));
        // 转换为 Apis 列表
        List<Apis> apisList = restApiMap.entrySet().stream()
                .map(entry -> {
                    Apis apis = new Apis();
                    apis.setCategory(entry.getKey());
                    apis.setApis(entry.getValue());
                    return apis;
                })
                .collect(Collectors.toList());
        return BaseRes.success(apisList);
    }

    /**
     * 获取统一配置信息
     *
     * @return 配置信息
     */
    @GetMapping("/config")
    @ResponseBody
    public DocProperties getConfig() {
        return docProperties;
    }


    /**
     * 根据id 获取接口文档详情
     *
     * @param id 接口文档id
     * @return 接口文档详情
     */

    @GetMapping("/api/{id}")
    @ResponseBody
    public BaseRes<ApiInfo> getApiDocById(
            @PathVariable @ApiProperty(description = "接口文档id") String id) {
        ApiInfo apiInfo = restDocScanner.getApiInfoById(id);
        return BaseRes.success(apiInfo);
    }
}